package com.toncen.samepms.common;

public interface IDao<M extends IDomain> {

	/**
	 * 添加对象,配置文件statement的id命名规则：statementPrefix(表名)
	 * +statementDivision(分隔符)+add(后缀)
	 * 
	 * @param domain
	 * @return 如果使用数据库自动生成主键，则返回数据库自动生成的主键，如果自己指定主键，则返回自己指定的主键，如果两者都指定，则数据库自动生成的主键优先，如果两者都没有指定，则抛出Exception异常
	 * @throws Exception
	 */
	public abstract long add(M domain) throws Exception;

	/**
	 * 更新对象,配置文件statement的id命名规则：statementPrefix(表名) +statementDivision(分隔符)
	 * +update(后缀)
	 * 
	 * @param domain
	 * @return 受影响的记录数目
	 * @throws Exception
	 */
	public abstract int update(M domain) throws Exception;

	/**
	 * 根据domain的id是否为保存过，自动调用新增或者修改方法，具体配置文件statement的id命名规则参考新增或者修改方法的配置
	 * 
	 * @param domain
	 * @return 如果是新增，则返回主键值，如果是修改，则返回修改影响的记录数目
	 * @throws Exception
	 */
	public long save(M domain) throws Exception;

	/**
	 * 根据id加载对象,配置文件statement的id命名规则：statementPrefix(表名) +statementDivision(分隔符)
	 * +getById(后缀)
	 * 
	 * @param id
	 * @return 返回加载的对象，没有找到对象则抛出Exception异常
	 * @throws Exception
	 */
	public abstract M load(long id) throws Exception;

	/**
	 * 根据id查询对象,配置文件statement的id命名规则：statementPrefix(表名) +statementDivision(分隔符)
	 * +getById(后缀)
	 * 
	 * @param id
	 * @return 如果找到则返回此对象，没有找到则返回空引用null
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public abstract M find(long id) throws Exception;

	/**
	 * 根据id删除对象,配置文件statement的id命名规则：statementPrefix(表名) +statementDivision(分隔符)
	 * +delById(后缀)
	 * 
	 * @param id
	 * @return 受影响的记录数目
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public abstract int delete(long id) throws Exception;

	/**
	 * 开始事务
	 * 
	 * @throws Exception
	 */
	public abstract void beginTransaction() throws Exception;

	/**
	 * 提交事务
	 * 
	 * @throws Exception
	 */
	public abstract void commitTransaction() throws Exception;

	/**
	 * 回滚事务
	 * 
	 * @throws Exception
	 */
	public abstract void rollback() throws Exception;

	/**
	 * 结束事务
	 * 
	 * @throws Exception
	 */
	public abstract void endTransaction() throws Exception;

}